// 2-1-2 基本的输入输出-标准输出流（cout）
/**
 * C++ 基本的输入输出
 * C++ 标准库提供了一组丰富的输入/输出功能，我们将在后续的章节进行介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。
 * 
 * C++ 的 I/O 发生在流中，流是字节序列。如果字节流是从设备（如键盘、磁盘驱动器、网络连接等）流向内存，这叫做输入操作。如果字节流是从内存流向设备（如显示屏、打印机、磁盘驱动器、网络连接等），这叫做输出操作。
 * 
 * I/O 库头文件
 * 下列的头文件在 C++ 编程中很重要。
 * 1. <iostream>
 * 该文件定义了 cin、cout、cerr 和 clog 对象，分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。
 * 
 * 2. <iomanip>
 * 该文件通过所谓的参数化的流操纵器（比如 setw 和 setprecision），来声明对执行标准化 I/O 有用的服务。
 * 
 * 3. <fstream>
 * 该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节。
 * 
 * ------------
 * 标准输出流（cout）
 * 预定义的对象 cout 是 iostream 类的一个实例。cout 对象"连接"到标准输出设备，通常是显示屏。cout 是与流插入运算符 << 结合使用的，如下所示(示例一)：
 * 
 * C++ 编译器根据要输出变量的数据类型，选择合适的流插入运算符来显示值。<< 运算符被重载来输出内置类型（整型、浮点型、double 型、字符串和指针）的数据项。
 * 
 * 流插入运算符 << 在一个语句中可以多次使用，如上面实例中所示，endl 用于在行末添加一个换行符。
*/

#include <iostream>

int main(void)
{
  // save default formatting
  std::ios init(NULL);
  init.copyfmt(std::cout);

  // change formatting...

  std::cout << "\n----------cout precision----------\n"
            << std::endl;

  std::cout << 1234567.1234567890 << std::endl; // 1.23457e+06
  std::cout.precision(5);
  std::cout << 99.1234567 << std::endl;         // 99.123
  std::cout << 1.1234567 << std::endl;          // 1.1235
  std::cout << 0.1234567 << std::endl;          // 0.12346
  std::cout << 1234567.1234567890 << std::endl; // 1.2346e+06
  std::cout.precision(20);
  std::cout << 1234567.1234567890 << std::endl; // 1234567.1234567889478 double精度问题

  std::cout << "\n----------cout width & fill----------\n"
            << std::endl;
  std::cout.width(30);
  std::cout << "Hello"
            << " World "
            << "!" << std::endl; //                Hello World !

  std::cout.width(30);
  std::cout.fill('*');
  // std::cout << "Hello World !" << std::endl;// *****************Hello World !

  // std::cout << "Hello";
  // std::cout << " World ";
  // std::cout << "!" << std::endl; // *****************Hello World !

  std::cout << "Hello" << std::endl;// *************************Hello
  std::cout << "World" << std::endl;// World  width 30超过了
  std::cout << "!" << std::endl;// !

  // restore default formatting
  std::cout << "\n----------restore default formatting----------\n"
            << std::endl;
  std::cout.copyfmt(init);
  std::cout << 3.1415926 << std::endl;

  printf("---------end----------\n");
  // system("pause");
  return 0;
}